/**
 * Copyright (c) 2014-2017, huli.com
 * All rights reserved.
 */
package com.xiaohujr.xuexue.vm.exceptions;

/**
 * 虚拟机栈和本地方法栈溢出.
 * <p>
 * 每当java程序启动一个新的线程时，java虚拟机会为他分配一个栈，
 * java栈以帧为单位保持线程运行状态；当线程调用一个方法是，
 * jvm压入一个新的栈帧到这个线程的栈中，只要这个方法还没返回，这个栈帧就存在。
 * 如果方法的嵌套调用层次太多(如递归调用),随着java栈中的帧的增多，
 * 最终导致这个线程的栈中的所有栈帧的大小的总和大于-Xss设置的值，
 * 而产生生StackOverflowError溢出异常。
 *
 * @author Xue Xue (xuexue1@huli.com)
 * @version $Id$
 * @since 2018/5/2
 */
public class JavaVMStackSOF {

    private int stackLength = 1;

    public void stackLeak() {
        stackLength++;
        stackLeak();
    }

    /**
     * VM Args: -Xss128k  栈容量设置.
     *
     * @param args 虚拟机参数.
     */
    public static void main(String[] args) {
        JavaVMStackSOF oom = new JavaVMStackSOF();
        try {
            oom.stackLeak();
        } catch (Throwable e) {
            System.out.print("stack length:" + oom.stackLength);
            throw e;
        }

    }
}
